package com.hqyj.mall.xiaomimall.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.hqyj.mall.xiaomimall.entity.Users;
import com.hqyj.mall.xiaomimall.json.R;
import com.hqyj.mall.xiaomimall.service.UsersService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RequestMapping("users")
@RestController
public class UsersController extends BaseController {

    @Resource
    private UsersService usersService;

    @PostMapping("/")
    public R register(@RequestBody Users u) {
        try {
            if (usersService.register(u)) {
                return R.success("注册成功！");
            }
            return R.fail("注册失败！");
        } catch (Exception ex) {
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }

    @GetMapping("auth")
    public R login(@RequestParam(value = "identify", required = true) String identify, @RequestParam(value = "password", required = true) String password, @RequestParam("token") String token, @RequestParam("code") String code) {
        try {
            //1.第一步检查用户输入的图形验证码是否正确；
            //从redis缓存中取出验证码
            if (redisUtil.get(token) == null) {
                return R.fail("验证码验证失败");
            }
            String sessionRandomCode = (String) redisUtil.get(token);
            if (!sessionRandomCode.equalsIgnoreCase(code)) {
                return R.fail("验证码验证失败");
            }

            //2.第二部调用用户登录的接口；
            Users loginSuccessUser = usersService.login(identify, password);
            if (loginSuccessUser != null) {
                loginSuccessUser.setPassword(""); //把密码返回给前端不安全。
                //以下是sa-token登录权限部分代码
                //根据登录成功的用户ID生成一个token保存到redis中.
                StpUtil.login(loginSuccessUser.getUid());
                loginSuccessUser.setTokenName(StpUtil.getTokenName());
                loginSuccessUser.setTokenValue(StpUtil.getTokenValue());

                return R.success("登录成功！", loginSuccessUser);
            } else {
                return R.fail("登录失败，请检查用户名或者密码是否正确！");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }

    @GetMapping("isReg")
    public R checkIdentifyIsReg(@RequestParam(value = "identify", required = true) String identify) {
        try {

            boolean flag = usersService.checkIsReg(identify);
            //flag如果是true,说明这个账号已经注册了，如果是false说明可以注册；
            if (flag) {
                return R.fail("该手机或者邮箱账号已经被注册！");
            } else {
                return R.success("该手机或者邮箱可以注册！");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }

    @GetMapping("isLogin")
    public R isLogin() {
        try {
            return R.success("检查用户登录状态成功！", StpUtil.isLogin());
        } catch (Exception ex) {
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }

    @GetMapping("logout")
    public R logout() {
        try {
            StpUtil.logout();
            return R.success("注销成功！");
        } catch (Exception ex) {
            ex.printStackTrace();
            return R.error("程序出现异常！");
        }
    }
}